package flst.ipiweb.persistance.dao.jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import flst.ipiweb.persistance.dao.IAdministrateurDao;
import flst.ipiweb.transverse.Administrateur;
import flst.ipiweb.transverse.IPIException;

public class AdministrateurDaoJdbc implements IAdministrateurDao {

	private JdbcUtils jdbcUtils = JdbcUtils.getInstance();

	@Override
	/**
	 * Cette méthode permet de créer un nouvel administrateur en base
	 * @param admin le nouvel administrateur
	 * @return Adminsitrateur : l'administrateur mis à jour
	 */
	public void createAdministrateur(Administrateur admin)
			throws IPIException {

		try {
			Connection vConnection = jdbcUtils.getConnection();
			String vRequeteInsert = "INSERT INTO IPII_USERS (USER_ID, LAST_NAME, FIRST_NAME, LOGIN, ENCRYPTED_PASSWORD,RESPONSIBILITY_ID)"
					+ "VALUES(SEQ_USER.NEXTVAL,?,?,?,?,?)";
			PreparedStatement vPs = vConnection
					.prepareStatement(vRequeteInsert);
			// LAST_NAME
			vPs.setString(1, admin.getNom());
			// FIRST_NAME
			vPs.setString(2, admin.getPrenom());
			// LOGIN
			vPs.setString(3, admin.getLoginUtilisateur());
			// ENCRYPTED_PASSWORD
			vPs.setString(4, admin.getPassword());
			// RESPONSIBILITY_ID
			// TODO determiner la responsablite d'un admin normal
			vPs.setInt(5, 2);
			vPs.executeUpdate();

			vPs.close();
			vConnection.close();
		} catch (Exception e) {
			throw new IPIException("AdminException.create.technique");

		}
	}

	@Override
	/**
	 * Cette méthode permet de récupérer la liste des administrateurs en base
	 * @return List<Administrateur> la liste des administrateur
	 */
	public List<Administrateur> listerAdministrateurs() throws IPIException {

		List<Administrateur> listeAdmin = new ArrayList<Administrateur>();

		try {
			Connection vConnection = jdbcUtils.getConnection();
			Statement vStmt = vConnection.createStatement();

			String vRequeteSelect = "SELECT * FROM IPII_USERS WHERE RESPONSIBILITY_ID=1 OR RESPONSIBILITY_ID=2 ORDER BY RESPONSIBILITY_ID";
			vStmt.execute(vRequeteSelect);
			ResultSet vRs = vStmt.getResultSet();
			while (vRs.next()) {
				Administrateur admin = new Administrateur();
				// USER_ID
				admin.setIdUser(vRs.getInt("USER_ID"));
				// LAST_NAME
				admin.setNom(vRs.getString("LAST_NAME"));
				// FIRST_NAME
				admin.setPrenom(vRs.getString("FIRST_NAME"));
				// LOGIN
				admin.setLoginUtilisateur(vRs.getString("LOGIN"));
				// PASSWORD
				admin.setPassword(vRs.getString("ENCRYPTED_PASSWORD"));
				// SUPER_USER
				if (vRs.getInt("RESPONSIBILITY_ID") == 1) {
					admin.setIsSuper(true);
				} else {
					admin.setIsSuper(false);
				}

				listeAdmin.add(admin);
			}

			vStmt.close();
			vConnection.close();
		} catch (Exception e) {
			throw new IPIException("AdminException.list.technique");
		}
		return listeAdmin;
	}

	@Override
	/**
	 * Cette méthode permet de mettre à jour un administrateur en base
	 * @param admin l'administrateur à mettre à jour
	 * @return Administrateur : l'administrateur
	 */
	public void updateAdministrateur(Administrateur admin) throws IPIException {
		
		try {
			Connection vConnection = jdbcUtils.getConnection();
			String vRequeteUpdate = "UPDATE IPII_USERS SET LAST_NAME=?, FIRST_NAME=?, LOGIN=?, ENCRYPTED_PASSWORD=?, LAST_UPDATE_DATE=SYSDATE WHERE USER_ID=?";
			PreparedStatement vPs = vConnection.prepareStatement(vRequeteUpdate);
			// LAST_NAME
			vPs.setString(1, admin.getNom());
			// FIRST_NAME
			vPs.setString(2, admin.getPrenom());
			// LOGIN
			vPs.setString(3, admin.getLoginUtilisateur());
			// ENCRYPTED_PASSWORD
			vPs.setString(4, admin.getPassword());
			// user_id
			vPs.setInt(5, admin.getIdUser());

			vPs.executeUpdate();

			vPs.close();
			vConnection.close();
		} 
		catch (Exception e) {
			throw new IPIException("AdminException.update.technique");
		}
	}

	/**
	 * Cette méthode permet de supprimer un administrateur en base
	 * 
	 * @param admin
	 *            : l'administrateur à supprimer
	 */
	public void deleteAdministrateur(Administrateur admin) throws IPIException{

		try {
			Connection vConnection = jdbcUtils.getConnection();
			String vRequeteDelete = "DELETE FROM IPII_USERS WHERE USER_ID=?";
			PreparedStatement vPs = vConnection
					.prepareStatement(vRequeteDelete);
			// user_id
			vPs.setInt(1, admin.getIdUser());
			vPs.executeUpdate();

			vPs.close();
			vConnection.close();
		} catch (Exception e) {
			throw new IPIException("AdminException.delete.technique");
		}
	};

	@Override
	/**
	 * Cette méthode permet de retrouver un administrateur en base grâce à son identifiant
	 * @param idAdministrateur : identifiant de l'administrateur
	 * @return Administrateur : l'administrateur trouvé
	 */
	public Administrateur getAdministrateurById(int idAdministrateur) throws IPIException {
		
		try {
			Connection vConnection = jdbcUtils.getConnection();
			String vRequeteInsert = "SELECT * FROM IPII_USERS WHERE USER_ID = ?";
			PreparedStatement vPs = vConnection.prepareStatement(vRequeteInsert);
			// LOGIN
			vPs.setInt(1, idAdministrateur);
			
			ResultSet rs = vPs.executeQuery();
			
			Administrateur admin = new Administrateur();
			
			if (rs.next()) {
				admin.setIdUser(idAdministrateur);
				admin.setLoginUtilisateur(rs.getString("LOGIN"));
				admin.setNom(rs.getString("LAST_NAME"));
				admin.setPrenom(rs.getString("FIRST_NAME"));
				if (rs.getInt("RESPONSIBILITY_ID") == 1) {
					admin.setIsSuper(true);
				} else {
					admin.setIsSuper(false);
				}
			} 
			else {
				throw new IPIException("AdminException.update.notExist");
			}
			
			vPs.close();
			vConnection.close();
			
			return admin;
		} 
		catch (Exception e) {
			throw new IPIException("AdminException.update.technique");
		}
	}

	@Override
	/**
	 * Cette méthode permet de vérifier si le login de l'administrateur existe
	 * @param admin : administrateur dont le login est à vérifier
	 * @return Boolean : "true" si le login de l'admin existe, "false" sinon
	 */
	public Boolean loginExiste(Administrateur admin) throws IPIException {
		try {
			Connection vConnection = jdbcUtils.getConnection();
			String vRequeteInsert = "SELECT * FROM IPII_USERS WHERE LOGIN = ?";
			PreparedStatement vPs = vConnection
					.prepareStatement(vRequeteInsert);
			// LOGIN
			vPs.setString(1, admin.getLoginUtilisateur());

			ResultSet rs = vPs.executeQuery();
			Boolean existe = rs.next();
			vPs.close();
			vConnection.close();
			return existe;
		} catch (Exception e) {
			throw new IPIException("Exception.dao.technique");
		}
	}
	
	/**
	 * Cette méthode permet de vérifier l'existance du couple login/password
	 * @param admin : administrateur à vérifier
	 * @return Boolean :"true" si le couple existe, "false" sinon
	 * @throws IPIException
	 */
	public Administrateur loginPasswordExist(Administrateur admin) throws IPIException
	{
		try {
			Connection vConnection = jdbcUtils.getConnection();
			String vRequeteInsert = "SELECT * FROM IPII_USERS WHERE LOGIN = ? AND ENCRYPTED_PASSWORD = ?";
			PreparedStatement vPs = vConnection
					.prepareStatement(vRequeteInsert);
			// LOGIN
			vPs.setString(1, admin.getLoginUtilisateur());
			// PASSWORD
			vPs.setString(2, admin.getPassword());

			ResultSet rs = vPs.executeQuery();
			if (rs.next()) {
				admin.setIdUser(rs.getInt("USER_ID"));
				admin.setLoginUtilisateur(rs.getString("LOGIN"));
				admin.setNom(rs.getString("LAST_NAME"));
				admin.setPrenom(rs.getString("FIRST_NAME"));
				if (rs.getInt("RESPONSIBILITY_ID") == 1) {
					admin.setIsSuper(true);
				} else {
					admin.setIsSuper(false);
				}
			} 
			
			vPs.close();
			vConnection.close();
			return admin;
		} catch (Exception e) {
			throw new IPIException("Exception.dao.technique");
		}
	}

	
}
